package controller;

import dao.QuestaoAbordaConteudoJpaController;
import dao.QuestaoProfessorJpaController;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import dao.exceptions.NonexistentEntityException;
import java.util.ArrayList;
import model.Conteudo;
import model.ConteudoDaEmenta;
import model.Disciplina;
import model.DisciplinaProfessor;
import model.Ementa;
import model.Professor;
import model.Questao;
import model.QuestaoAbordaConteudo;
import model.QuestaoProfessor;
import org.primefaces.model.DualListModel;
import pagecontroller.JsfUtil;

/**
 *
 * @author Edilson Fernandes da Costa
 * @version 1.0
 */
public class QuestaoProfessorController extends Controller {

    public QuestaoProfessorController() {
        if (JsfUtil.getObjectFromSession("QuestaoProfessorJpaController") == null) {
            jpaController = new QuestaoProfessorJpaController();
        } else {
            jpaController = (QuestaoProfessorJpaController) JsfUtil.getObjectFromSession("QuestaoProfessorJpaController");
        }
    }
    private QuestaoProfessor questaoProfessor = null;
    private QuestaoProfessor questaoProfessorAux = null;
    private QuestaoProfessorJpaController jpaController = null;
    private List<QuestaoProfessor> questaoProfessors = null;
    private QuestaoController questaoController;
    private DisciplinaProfessor disciplinaProfessor;
    private Ementa ementa;
    private List<Ementa> ementas;
    private List<Conteudo> conteudos;
    private List<Conteudo> conteudosSelecionados;
    private DualListModel<Conteudo> conteudosDlm;
    private String searchConteudo;
    private Conteudo conteudo;
    private String stringPesquisa;
    private List<Questao> questaosPesquisa = null;

    public String persiste() {
        if (questaoProfessor.getId() == null) {
            return create();
        } else {
            return update();
        }
    }

    public String update() {
        try {
            questaoProfessor.setProfessor(getUsuarioController().getUsuarioLogado().getProfessor());
            questaoProfessor.setQuestao(this.getQuestao());
            getQuestaoProfessorController().getJpaController().edit(questaoProfessor);
            for (QuestaoAbordaConteudo qac : questaoProfessor.getQuestaoAbordaConteudos()) {
                getQuestaoAbordaConteudoController().getJpaController().edit(qac);
            }
            questaoProfessorAux = questaoProfessor;
            questaoProfessor = null;

            JsfUtil.addSuccessMessage("Questão Atualizada no Workspace com Sucesso");
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(QuestaoProfessorController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(QuestaoProfessorController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "refreshPage";
    }

    public String create() {
        try {

            questaoProfessor.setProfessor(getUsuarioController().getUsuarioLogado().getProfessor());
            questaoProfessor.setQuestao(this.getQuestao());

            getQuestaoProfessorController().getJpaController().create(questaoProfessor);

//            for (QuestaoAbordaConteudo qac : questaoProfessor.getQuestaoAbordaConteudos()) {
//                getQuestaoAbordaConteudoController().getJpaController().create(qac);
//            }

            questaoProfessorAux = questaoProfessor;
            questaoProfessor = null;
            JsfUtil.addSuccessMessage("Questão cadastrado no Workspace com sucesso.");
            getPageManager().setPageQuestaoWorkspaceRelat();
        } catch (Exception e) {
            JsfUtil.ensureAddErrorMessage(e, "Ocorreu um erro na percistencia dos dados.");
            return null;
        }
        return "refreshPage";
    }

    public String edit() {
        QuestaoProfessor questaoProfessorTemp = (QuestaoProfessor) JsfUtil.getObjectFromRequestParameter("questaoProfessor");
        this.questaoProfessor = questaoProfessorTemp;
        return "refreshPage";
    }

    public String destroy() {
        QuestaoProfessor questaoProfessorTemp = (QuestaoProfessor) JsfUtil.getObjectFromRequestParameter("questaoProfessor");
        try {
            jpaController.destroy(questaoProfessorTemp.getId());
            JsfUtil.addSuccessMessage("QuestaoProfessor removido com sucesso.");
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(QuestaoProfessorController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "refreshPage";
    }

    public QuestaoProfessor getQuestaoProfessor() {
        if (questaoProfessor == null) {
            questaoProfessor = new QuestaoProfessor();
            questaoProfessor.setQuestaoAbordaConteudos(new ArrayList<QuestaoAbordaConteudo>());

        }
        return questaoProfessor;
    }

    public List<QuestaoProfessor> getQuestaoProfessors() {
        try {
            questaoProfessors = jpaController.findQuestaoProfessor(getUsuarioLogado().getProfessor());
        } catch (Exception ex) {
            Logger.getLogger(QuestaoProfessorController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return this.questaoProfessors;
    }

    public QuestaoProfessorJpaController getJpaController() {
        return jpaController;
    }

    public QuestaoProfessor getQuestaoProfessorAux() {
        return questaoProfessorAux;
    }

    public int getNumeroQuestoes() {
        try {
            return jpaController.getNumeroQuestoes(getUsuarioLogado().getProfessor());
        } catch (Exception ex) {
            Logger.getLogger(QuestaoProfessorController.class.getName()).log(Level.SEVERE, null, ex);
            return 0;
        }

    }

    public void setQuestaoController(QuestaoController questaoController) {
        this.questaoController = questaoController;
    }

    public String getSearchConteudo() {
        if (searchConteudo == null) {
            searchConteudo = "";
        }
        return searchConteudo;
    }

    public void setSearchConteudo(String searchConteudo) {
        this.searchConteudo = searchConteudo;
    }

    public List<Conteudo> getConteudos() {

        if (conteudos == null) {
            conteudos = getConteudoController().getConteudos();
        }


        for (QuestaoAbordaConteudo qac : getQuestaoProfessor().getQuestaoAbordaConteudos()) {
            if (conteudos.contains(qac.getConteudo())) {
                conteudos.remove(qac.getConteudo());
            }
        }

        return conteudos;
    }

    public void setConteudos(List<Conteudo> conteudos) {
        this.conteudos = conteudos;
    }

    public void searchConteudo() {
        conteudos = Controllers.getConteudoControllers().getConteudos(searchConteudo);
    }

    public Conteudo getConteudo() {
        if (conteudo == null) {
            conteudo = new Conteudo();
        }
        return conteudo;
    }

    public void setConteudo(Conteudo conteudo) {
        this.conteudo = conteudo;
    }

    public DualListModel<Conteudo> getConteudosDlm() {
        if (conteudosDlm == null) {
            conteudosDlm = new DualListModel<Conteudo>(getConteudos(), getConteudosSelecionados());
        }
        return conteudosDlm;
    }

    public void setConteudosDlm(DualListModel<Conteudo> conteudosDlm) {
        this.conteudosDlm = conteudosDlm;
    }

    public List<Conteudo> getConteudosSelecionados() {
        if (conteudosSelecionados == null) {
            conteudosSelecionados = new ArrayList<Conteudo>();

        }

        for (QuestaoAbordaConteudo qac : questaoProfessor.getQuestaoAbordaConteudos()) {
            conteudosSelecionados.add(qac.getConteudo());
        }

        return conteudosSelecionados;
    }

    public void setConteudosSelecionados(List<Conteudo> conteudosSelecionados) {
        this.conteudosSelecionados = conteudosSelecionados;
    }

//
//
//
//    public DualListModel<ConteudoDaEmenta> getConteDualListModel() {
//        if(conteDualListModel == null){
//            conteDualListModel = new DualListModel<ConteudoDaEmenta>(conteudoDaEmentas, conteudoDaEmentasSelecionados);
//        }
//
//        return conteDualListModel;
//    }
//
//    public void setConteDualListModel(DualListModel<ConteudoDaEmenta> conteDualListModel) {
//        this.conteDualListModel = conteDualListModel;
//    }
//
//
//
//    public List<ConteudoDaEmenta> getConteudoDaEmentas() {
//        conteudoDaEmentas = Controllers.getConteudoDaEmentaControllers().getConteudoDaEmentas();
//        return conteudoDaEmentas;
//    }
//
//    public void setConteudoDaEmentas(List<ConteudoDaEmenta> conteudoDaEmentas) {
//        this.conteudoDaEmentas = conteudoDaEmentas;
//    }
//
//
//
//    public List<ConteudoDaEmenta> getConteudoDaEmentasSelecionados() {
//        if(conteudoDaEmentasSelecionados == null){
//            conteudoDaEmentasSelecionados = new ArrayList<ConteudoDaEmenta>();
//        }
//        return conteudoDaEmentasSelecionados;
//    }
//
//
//    public void setConteudoDaEmentasSelecionados(List<ConteudoDaEmenta> conteudoDaEmentasSelecionados) {
//        this.conteudoDaEmentasSelecionados = conteudoDaEmentasSelecionados;
//    }
//
//
//
//
//
//
//
//    public List<Conteudo> getConteudos() {
//        List<ConteudoDaEmenta> conteudoDaEmentas = Controllers.getConteudoDaEmentaControllers().getConteudoDaEmentas(getEmenta());
//
//        if(conteudoDaEmentas == null){
//            conteudoDaEmentas = new ArrayList<ConteudoDaEmenta>();
//        }
//        for(ConteudoDaEmenta ce:conteudoDaEmentas){
//            conteudos.add(ce.getConteudo());
//        }
//        return conteudos;
//    }
//
//
//    public ConteudoDaEmenta getConteudoDaEmenta() {
//        if (conteudoDaEmenta == null) {
//            try {
//                conteudoDaEmenta = Controllers.getConteudoDaEmentaControllers().getConteudoDaEmentas().get(0);
//            } catch (Exception e) {
//            }
//            if (conteudoDaEmenta == null) {
//                conteudoDaEmenta = new ConteudoDaEmenta();
//            }
//        }
//
//        return conteudoDaEmenta;
//    }
//
//    public void setConteudoDaEmenta(ConteudoDaEmenta conteudoDaEmenta) {
//        this.conteudoDaEmenta = conteudoDaEmenta;
//    }
//
    public DisciplinaProfessor getDisciplinaProfessor() {
        if (disciplinaProfessor == null) {

            try {
                disciplinaProfessor = getDisciplinaProfessorController().getDisciplinaProfessorLogado().get(0);
            } catch (Exception e) {
            }

        }
        return disciplinaProfessor;
    }

    public void setDisciplinaProfessor(DisciplinaProfessor disciplinaProfessor) {
        this.disciplinaProfessor = disciplinaProfessor;
    }

    public Ementa getEmenta() {
        if (ementa == null) {
            try {
                getEmentaController().getEmentas().get(0);
            } catch (Exception e) {
            }

            if (ementa == null) {
                ementa = new Ementa();
            }
        }
        return ementa;
    }

    public void setEmenta(Ementa ementa) {
        this.ementa = ementa;
    }

    public String removeConteudo() {
        QuestaoAbordaConteudo qac = (QuestaoAbordaConteudo) JsfUtil.getObjectFromRequestParameter("questaoAbordaConteudoTemp");
        for (int i = 0; i < getQuestaoProfessor().getQuestaoAbordaConteudos().size(); i++) {
            QuestaoAbordaConteudo qac1 = getQuestaoProfessor().getQuestaoAbordaConteudos().get(i);
            if (qac.getConteudo().getId() == qac1.getConteudo().getId()) {
                getQuestaoProfessor().getQuestaoAbordaConteudos().remove(i);
                return "refreshPage";
            }
        }
        return "refreshPage";
    }

    public String addConteudo() {
        QuestaoAbordaConteudo questaoAbordaConteudo = new QuestaoAbordaConteudo();

//        for (Conteudo c : conteudosSelecionados) {
//            questaoAbordaConteudo = new QuestaoAbordaConteudo();
//            questaoAbordaConteudo.setConteudo(c);
//            questaoAbordaConteudo.setQuestaoProfessor(questaoProfessor);
//            questaoProfessor.getQuestaoAbordaConteudos().add(questaoAbordaConteudo);
//        }
//        conteudosSelecionados = null;
//        conteudos = null;

        questaoAbordaConteudo.setConteudo(conteudo);
        questaoAbordaConteudo.setQuestaoProfessor(questaoProfessor);
        questaoProfessor.getQuestaoAbordaConteudos().add(questaoAbordaConteudo);

        return "refreshPage";
    }

    public Questao getQuestao() {
        Questao questao = (Questao) JsfUtil.getObjectFromSession("QuestaoTemp");
        if (questao == null) {
            questao = new Questao();
        }
        return questao;
    }

    public Questao getQuestaoToQuestaoProfessor() {
        if (this.getQuestaoProfessor().getQuestao() != null) {
            return this.getQuestaoProfessor().getQuestao();
        } else {
            return null;
        }
    }

    public String pesquisarConteudo() {

        conteudos = new ArrayList<Conteudo>();
        List<ConteudoDaEmenta> conteudoDaEmentas = Controllers.getConteudoDaEmentaControllers().getConteudoDaEmentas(getEmenta());

        for (ConteudoDaEmenta cde : conteudoDaEmentas) {
            conteudos.add(cde.getConteudo());
        }

        if (searchConteudo != null && searchConteudo != "") {
            List<Conteudo> conteudosTemp = new ArrayList<Conteudo>();

            for (Conteudo c : getConteudos()) {
                if (c.getConteudo().contains(searchConteudo)) {
                    conteudosTemp.add(c);
                }
            }
            conteudos = conteudosTemp;

        }

        return "refreshPage";
    }

    public String incluir() {
        setConteudo((Conteudo) JsfUtil.getObjectFromRequestParameter("conteudoTemp"));
        addConteudo();
        return "refreshPage";
    }

    public List<Conteudo> getConteudosDaQuestao() {
        QuestaoProfessor questaoProfessorTemp = questaoProfessor;
        if (questaoProfessorTemp == null) {
            questaoProfessorTemp = questaoProfessorAux;
        }
        List<Conteudo> conteudos = new ArrayList<Conteudo>();
        for (QuestaoAbordaConteudo qac : questaoProfessorTemp.getQuestaoAbordaConteudos()) {
            conteudos.add(qac.getConteudo());
        }
        return conteudos;
    }

    public List<Questao> getQuestoesProfessorLogado() {
        List<Questao> questoes = new ArrayList<Questao>();
        for (QuestaoProfessor qp : getQuestaoProfessors()) {
            questoes.add(qp.getQuestao());
        }

        return questoes;
    }

    public QuestaoProfessor getQuestaoProfessor(Questao questao) {
        for (QuestaoProfessor qp : getQuestaoProfessors()) {
            if (qp.getQuestao().getId().equals(questao.getId())) {
                return qp;
            } else {
                System.out.println(qp.getQuestao().getId() + " é diferente de " + questao.getId());
            }
        }
        return null;
    }

    public List<Ementa> getEmentas() {
        ementas = getEmentaController().finEmentas(getDisciplinaProfessor());

        return ementas;
    }

    public void setEmentas(List<Ementa> ementas) {
        this.ementas = ementas;
    }

    public String getStringPesquisa() {
        return stringPesquisa;
    }

    public void setStringPesquisa(String stringPesquisa) {
        this.stringPesquisa = stringPesquisa;
    }

    public List<Questao> getQuestaosPesquisa() {
        if (questaosPesquisa == null) {
            questaosPesquisa = new ArrayList<Questao>();
        }
        return questaosPesquisa;
    }

    public void setQuestaosPesquisa(List<Questao> questaosPesquisa) {
        this.questaosPesquisa = questaosPesquisa;
    }

    public void pesquisar() {
        List<QuestaoProfessor>qps = jpaController.findQuestao(getStringPesquisa(), getUsuarioLogado().getProfessor());
        setQuestaosPesquisa(new ArrayList<Questao>());
        for(QuestaoProfessor qp:qps){
            getQuestaosPesquisa().add(qp.getQuestao());
        }
    }
}
